package com.jdk8;

import com.pojo.Student;

import java.util.*;
import java.util.function.*;

/**方法调用:  马上执行方法主体
 * https://www.jianshu.com/p/0a157fe545a7
 * 方法引用
 *   方法:
 *   引用:  只是得到方法名柄（不会执行)
 *
 *       类名::静态方法
 *       对象::普通方法
 *       类::new
 *   类型:
 *       1. Consumer消费型(方法只有一个参数，无返回类型)
 *          BiConsumer方法是两个参数，无返回类型
 *       2. Supplier供给型(方法没有参数，有返回类型)
 *       3. Function功能型(有参数，有返回类型，如果是2个参数就是BiFunction
 */

public class MethodReflect {

    public static void main(String[] args) {


        //----------------消费型------------------
        //java.util.function.Consumer<Integer>  consumer = System.out::println;
        //consumer.accept(123);

        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
        list.forEach(System.out::print);  //只有一个参数，无返回类型
        /*java.util.function.Consumer<Integer>  consumer = System.out::println;
        for (Integer i:list)
        {
            consumer.accept(i);
        }*/


        //----------- 供给型--------------------
        Student stu = new Student();
        stu.setSid(100);
        stu.setSname("张三");

        Supplier<String> supplier =  stu::toString;  //无参，有返回类型
        String   resultString = supplier.get();
        System.out.println(resultString);

        //------------- 功能型 --------------------
        BiFunction<Integer,Integer,Integer> function = stu::add;  //2个参数，1返回类型
        int sum = function.apply(1,2);
        System.out.println(sum);

        //--------------实例化 -------------------
        BiConsumer<Integer,String> biConsumer = Student::new;
        biConsumer.accept(200,"李四");

        //------------ 静态 -----------------
        BiFunction<Integer,Integer,Integer> function2 =  Student::add2;
        int sum2= function2.apply(3,4);
        System.out.println(sum2);

       //3个学生，按学号降序
        Student stu1 = new Student(1,"aaa");
        Student stu2 = new Student(3,"ccc");
        Student stu3 = new Student(2,"bbb");
        List<Student> students = Arrays.asList(stu1,stu2,stu3);
        //1.原始做法
        /*Collections.sort(students, new java.util.Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o2.getSid()-o1.getSid(); //按学号降序
            }

            @Override
            public boolean equals(Object obj) {
                return false;
            }
        });
        students.forEach(System.out::println);*/
        //2. Lambda 表达式实现
      /*  students.sort( (o1,o2)->{return o2.getSid()-o1.getSid();});
        students.forEach(System.out::println);*/


        //3.方法引用
        students.sort(Student::comp);
        students.forEach(System.out::println);


    }
}
